#include <stdio.h>
#include <string.h>
#include "queue.h"


void create_queue(void);
void delete_queue(void);
void print_explain(void);
void print_blank_lines(void);
int get_cmd(void);
void cmd_enqueue(void);
void cmd_dequeue(void);
void cmd_exit(void);
void enqueue_elem(int value);
int dequeue_elem(void);

//指令
enum Cmd_tag {
	CMD_ENQUEUE,
	CMD_DEQUEUE,
	CMD_EXIT,

	CMD_NUM
};

//指令類型

enum CmdStr_tag {
	CMD_STR_SHORT,
	CMD_STR_LONG,

	CMD_STR_NUM
};

//指令
static const char* CMD_STR[CMD_NUM][CMD_STR_NUM] = {
	{ "n", "enqueue" },
	{ "d", "dequeue" },
	{ "e", "exit" }
};

typedef void (*cmd_func)(void);
static const cmd_func CMD_FUNC[CMD_NUM] = {
	cmd_enqueue,
	cmd_dequeue,
	cmd_exit
};


Queue gQueue;


int main(void)
{
	create_queue();

	while( 1 ){
		print_explain();

		if( get_cmd() == 0 ){
			break;
		}

		print_blank_lines();
	}

	delete_queue();

	return 0;
}

//建立queue
void create_queue(void)
{
	gQueue = queue_create( 128 );
}

//刪除queue
void delete_queue(void)
{
	queue_delete( gQueue );
	gQueue = NULL;
}

//說明
void print_explain(void)
{
	puts("請輸入命令");
	printf( "將元素放入Queue: %s (%s)\n", CMD_STR[CMD_ENQUEUE][CMD_STR_SHORT], CMD_STR[CMD_ENQUEUE][CMD_STR_LONG] );
	printf( "從Queue取出: %s (%s)\n", CMD_STR[CMD_DEQUEUE][CMD_STR_SHORT], CMD_STR[CMD_DEQUEUE][CMD_STR_LONG] );
	printf( "結束: %s(%s)\n", CMD_STR[CMD_EXIT][CMD_STR_SHORT], CMD_STR[CMD_EXIT][CMD_STR_LONG] );
	puts( "" );
}

void print_blank_lines(void)
{
	printf("\n\n");
}

//接收指令

int get_cmd(void)
{
	char buf[20];
	size_t len;
	enum Cmd_tag cmd;
	int i;

	fgets( buf, sizeof(buf), stdin );

	len = strlen( buf );
	buf[len - 1] = '\0';  /* 換行*/

	for( i = 0; i < CMD_NUM; ++i ){
		if( strcmp( buf, CMD_STR[i][CMD_STR_SHORT] ) == 0
		 || strcmp( buf, CMD_STR[i][CMD_STR_LONG] ) == 0
		){
			cmd = i;
			break;
		}
	}

	if( cmd == CMD_EXIT ){
		return 0;
	}
	else if( 0 <= cmd && cmd < CMD_NUM ){
		CMD_FUNC[i]();
	}
	else{
		puts( "沒有這個指令" );
	}

	return 1;
}

/*
加入的指令
*/
void cmd_enqueue(void)
{
	char buf[40];
	int value;

	puts( "請輸入數值" );
	fgets( buf, sizeof(buf), stdin );
	sscanf( buf, "%d", &value );

	enqueue_elem( value );
}

/*
取出的指令
*/
void cmd_dequeue(void)
{
	if( queue_is_empty( gQueue ) ){
		puts( "Queue 已經空了" );
	}
	else{
		printf( "數值　%d 取出。\n", dequeue_elem() );
	}
}

/*
離開的指令
*/
void cmd_exit(void)
{
	puts( "終了します。" );
}

/*
加入元素
*/
void enqueue_elem(int value)
{
	queue_enqueue( gQueue, value );
}

/*
取出元素
*/
int dequeue_elem(void)
{
	return queue_dequeue( gQueue );
}
